package com.ellison.springboot.expandsboot.springbootutils;

import com.ellison.springdemo.entity.User;
import org.junit.Test;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;

/**
 <p>1. 获取方法
 // 在类中查找指定方法
 Method findMethod(Class<?> clazz, String name)
 // 同上，额外提供方法参数类型作查找条件
 Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
 // 获得类中所有方法，包括继承而来的
 Method[] getAllDeclaredMethods(Class<?> leafClass)
 // 在类中查找指定构造方法
 Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes)
 // 是否是 equals() 方法
 boolean isEqualsMethod(Method method)
 // 是否是 hashCode() 方法
 boolean isHashCodeMethod(Method method)
 // 是否是 toString() 方法
 boolean isToStringMethod(Method method)
 // 是否是从 Object 类继承而来的方法
 boolean isObjectMethod(Method method)
 // 检查一个方法是否声明抛出指定异常
 boolean declaresException(Method method, Class<?> exceptionType)

 <p>2. 执行方法
 // 执行方法
 Object invokeMethod(Method method, Object target)
 // 同上，提供方法参数
 Object invokeMethod(Method method, Object target, Object... args)
 // 取消 Java 权限检查。以便后续执行该私有方法
 void makeAccessible(Method method)
 // 取消 Java 权限检查。以便后续执行私有构造方法
 void makeAccessible(Constructor<?> ctor)

 <p>3. 获取字段
 // 在类中查找指定属性
 Field findField(Class<?> clazz, String name)
 // 同上，多提供了属性的类型
 Field findField(Class<?> clazz, String name, Class<?> type)
 // 是否为一个 "public static final" 属性
 boolean isPublicStaticFinal(Field field)

 <p>4. 设置字段
 // 获取 target 对象的 field 属性值
 Object getField(Field field, Object target)
 // 设置 target 对象的 field 属性值，值为 value
 void setField(Field field, Object target, Object value)
 // 同类对象属性对等赋值
 void shallowCopyFieldState(Object src, Object dest)
 // 取消 Java 的权限控制检查。以便后续读写该私有属性
 void makeAccessible(Field field)
 // 对类的每个属性执行 callback
 void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)
 // 同上，多了个属性过滤功能。
 void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc,
 ReflectionUtils.FieldFilter ff)
 // 同上，但不包括继承而来的属性
 void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)

 * @author Ellison_Pei
 * @date 2022/3/27 14:24
 * @since 1.0
 **/
public class ReflectionUtilsTest {

    @Test
    public void test() throws IllegalAccessException {
        User user = new User();
        Field username = ReflectionUtils.findField(user.getClass(), "username");
        ReflectionUtils.makeAccessible(username);
        username.set(user, "1111");
        System.out.println("end");
    }
}
